package com.zenithmind.coding.pojo.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 代码运行结果VO
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@Schema(description = "代码运行结果VO")
public class CodeRunResultVO {

    /**
     * 运行ID
     */
    @Schema(description = "运行ID")
    private String runId;

    /**
     * 运行状态（0-等待运行，1-运行中，2-运行成功，3-编译错误，4-运行错误，5-时间超限，6-内存超限，7-输出超限，8-系统错误）
     */
    @Schema(description = "运行状态（0-等待运行，1-运行中，2-运行成功，3-编译错误，4-运行错误，5-时间超限，6-内存超限，7-输出超限，8-系统错误）")
    private Integer status;

    /**
     * 状态描述
     */
    @Schema(description = "状态描述")
    private String statusMessage;

    /**
     * 编程语言
     */
    @Schema(description = "编程语言")
    private String language;

    /**
     * 源代码
     */
    @Schema(description = "源代码")
    private String sourceCode;

    /**
     * 输入数据
     */
    @Schema(description = "输入数据")
    private String input;

    /**
     * 程序输出
     */
    @Schema(description = "程序输出")
    private String output;

    /**
     * 期望输出
     */
    @Schema(description = "期望输出")
    private String expectedOutput;

    /**
     * 编译信息
     */
    @Schema(description = "编译信息")
    private String compileInfo;

    /**
     * 错误信息
     */
    @Schema(description = "错误信息")
    private String errorInfo;

    /**
     * 运行时间（毫秒）
     */
    @Schema(description = "运行时间（毫秒）")
    private Integer runTime;

    /**
     * 运行内存（KB）
     */
    @Schema(description = "运行内存（KB）")
    private Integer runMemory;

    /**
     * CPU使用率
     */
    @Schema(description = "CPU使用率")
    private Double cpuUsage;

    /**
     * 时间限制（毫秒）
     */
    @Schema(description = "时间限制（毫秒）")
    private Integer timeLimit;

    /**
     * 内存限制（KB）
     */
    @Schema(description = "内存限制（KB）")
    private Integer memoryLimit;

    /**
     * 编译开始时间
     */
    @Schema(description = "编译开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
    private LocalDateTime compileStartTime;

    /**
     * 编译结束时间
     */
    @Schema(description = "编译结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
    private LocalDateTime compileEndTime;

    /**
     * 编译耗时（毫秒）
     */
    @Schema(description = "编译耗时（毫秒）")
    private Long compileDuration;

    /**
     * 运行开始时间
     */
    @Schema(description = "运行开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
    private LocalDateTime runStartTime;

    /**
     * 运行结束时间
     */
    @Schema(description = "运行结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
    private LocalDateTime runEndTime;

    /**
     * 运行耗时（毫秒）
     */
    @Schema(description = "运行耗时（毫秒）")
    private Long runDuration;

    /**
     * 是否通过
     */
    @Schema(description = "是否通过")
    private Boolean passed;

    /**
     * 代码质量分析
     */
    @Schema(description = "代码质量分析")
    private CodeQualityAnalysis qualityAnalysis;

    /**
     * 性能分析
     */
    @Schema(description = "性能分析")
    private PerformanceAnalysis performanceAnalysis;

    /**
     * 代码质量分析
     */
    @Data
    @Schema(description = "代码质量分析")
    public static class CodeQualityAnalysis {
        
        /**
         * 代码行数
         */
        @Schema(description = "代码行数")
        private Integer lineCount;

        /**
         * 有效代码行数
         */
        @Schema(description = "有效代码行数")
        private Integer effectiveLineCount;

        /**
         * 注释行数
         */
        @Schema(description = "注释行数")
        private Integer commentLineCount;

        /**
         * 空行数
         */
        @Schema(description = "空行数")
        private Integer blankLineCount;

        /**
         * 圈复杂度
         */
        @Schema(description = "圈复杂度")
        private Integer cyclomaticComplexity;

        /**
         * 代码质量评分（0-100）
         */
        @Schema(description = "代码质量评分（0-100）")
        private Integer qualityScore;

        /**
         * 代码风格评分（0-100）
         */
        @Schema(description = "代码风格评分（0-100）")
        private Integer styleScore;

        /**
         * 可读性评分（0-100）
         */
        @Schema(description = "可读性评分（0-100）")
        private Integer readabilityScore;

        /**
         * 建议列表
         */
        @Schema(description = "建议列表")
        private List<String> suggestions;
    }

    /**
     * 性能分析
     */
    @Data
    @Schema(description = "性能分析")
    public static class PerformanceAnalysis {
        
        /**
         * 时间复杂度
         */
        @Schema(description = "时间复杂度")
        private String timeComplexity;

        /**
         * 空间复杂度
         */
        @Schema(description = "空间复杂度")
        private String spaceComplexity;

        /**
         * 性能评分（0-100）
         */
        @Schema(description = "性能评分（0-100）")
        private Integer performanceScore;

        /**
         * 优化建议
         */
        @Schema(description = "优化建议")
        private List<String> optimizationSuggestions;
    }
}
